from zerver.lib.test_classes import WebhookTestCase
from zerver.lib.validator import wrap_wild_value
from zerver.webhooks.opbeat.view import get_value


class OpbeatHookTests(WebhookTestCase):
    STREAM_NAME = "opbeat"
    URL_TEMPLATE = "/api/v1/external/opbeat?api_key={api_key}&stream={stream}"
    WEBHOOK_DIR_NAME = "opbeat"

    def test_comment(self) -> None:
        expected_topic_name = "foo commented on E#2"
        expected_message = """\
**[foo commented on E#2](https://opbeat.com/foo/test-flask-app/errors/2/#activity-5df00003ea4e42458db48446692f6d37)**
test comment


**[E#2](https://opbeat.com/foo/test-flask-app/errors/2/)**

>**Most recent Occurrence**
>in app.py
>A warning occurred (42 apples)"""
        self.check_webhook(
            "new_comment", expected_topic_name, expected_message, content_type="application/json"
        )

    def test_new_app(self) -> None:
        expected_topic_name = "foo"
        expected_message = """\
**foo**
App foo created

**[foo](https://opbeat.com/bar/foo/)**
>language: nodejs
>framework: custom"""
        self.check_webhook(
            "new_app", expected_topic_name, expected_message, content_type="application/json"
        )

    def test_get_empty_value(self) -> None:
        test_dictionary = wrap_wild_value("test_dictionary", {"key": "value"})
        self.assertEqual(get_value(test_dictionary, "foo"), "")

    def test_no_subject_type(self) -> None:
        expected_topic_name = "test title"
        expected_message = """\
**test title**
test summary"""
        self.check_webhook(
            "unsupported_object",
            expected_topic_name,
            expected_message,
            content_type="application/json",
        )

    def test_error_fixed(self) -> None:
        expected_topic_name = "foo marked E#2 as fixed"
        expected_message = """\
**[foo marked E#2 as fixed](https://opbeat.com/test_org/test-flask-app/errors/2/#activity-bf991a45d9184b0ca6fb3d48d3db4c38)**
foo marked the error group as fixed

**[E#2](https://opbeat.com/test_org/test-flask-app/errors/2/)**

>**Most recent Occurrence**
>in app.py
>A warning occurred (42 apples)"""
        self.check_webhook(
            "error_fixed", expected_topic_name, expected_message, content_type="application/json"
        )

    def test_error_reopened(self) -> None:
        expected_topic_name = "foo reopened E#2"
        expected_message = """\
**[foo reopened E#2](https://opbeat.com/test_org/test-flask-app/errors/2/#activity-38a556dfc0b04a59a586359bbce1463d)**
foo reopened the error group

**[E#2](https://opbeat.com/test_org/test-flask-app/errors/2/)**

>**Most recent Occurrence**
>in app.py
>A warning occurred (42 apples)"""
        self.check_webhook(
            "error_reopen", expected_topic_name, expected_message, content_type="application/json"
        )

    def test_error_regressed(self) -> None:
        expected_topic_name = "E#2 regressed"
        expected_message = """\
**[E#2 regressed](https://opbeat.com/test_org/test-flask-app/errors/2/#activity-c0396f38323a4fa7b314f87d5ed9cdd2)**
The error group regressed

**[E#2](https://opbeat.com/test_org/test-flask-app/errors/2/)**

>**Most recent Occurrence**
>in app.py
>A warning occurred (42 apples)"""
        self.check_webhook(
            "new_error", expected_topic_name, expected_message, content_type="application/json"
        )
